package org.jsola.hr.service;

import org.jsola.admin.query.HeaderFieldsQuery;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IFormGroupDAO;
import org.jsola.hr.dto.FormGroupAddDTO;
import org.jsola.hr.dto.FormGroupUpdateDTO;
import org.jsola.hr.entity.FormGroupDO;
import org.jsola.hr.query.FormGroupQuery;
import org.jsola.hr.vo.FormGroupListVO;
import org.jsola.hr.vo.FormGroupVO;
import org.jsola.hr.vo.FormHeaderVO;
import org.jsola.hr.vo.FormVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 表单字段分组
 *
 * @author zhr
 */
public interface IFormGroupService extends IService<IFormGroupDAO, FormGroupDO> {

    /**
     * 新增表单字段分组
     *
     * @param formGroupAddDTO 新增表单字段分组DTO
     * @param tokenUser       当前用户
     * @return 表单字段分组详情信息
     */
    FormGroupVO save(FormGroupAddDTO formGroupAddDTO, TokenUser tokenUser);

    /**
     * 批量新增表单字段分组
     *
     * @param formGroupAddDTOList 新增表单字段分组DTO
     * @param tokenUser           当前用户
     * @return 表单字段分组详情信息
     */
    List<FormGroupVO> batchSave(List<FormGroupAddDTO> formGroupAddDTOList, TokenUser tokenUser);

    /**
     * 批量保存
     *
     * @param insertList 保存列表
     */
    void batchSaveDO(List<FormGroupDO> insertList);

    /**
     * 修改表单字段分组
     *
     * @param formGroupUpdateDTO 修改表单字段分组DTO
     * @param tokenUser          当前用户
     * @return 更新数量
     */
    int update(FormGroupUpdateDTO formGroupUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除表单字段分组，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser    当前用户
     * @param check        是否做校验
     * @param formGroupIds 表单字段分组id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, Boolean check, Long... formGroupIds);

    /**
     * 根据表单字段分组id查找
     *
     * @param formGroupId 表单字段分组id
     * @param siteId      所属站点id
     * @return 表单字段分组详情信息
     */
    FormGroupVO selectById(Long formGroupId, String siteId);

    /**
     * 查询表单字段分组
     *
     * @param formGroupQuery 查询条件
     * @param siteId         所属站点id
     * @return 表单字段分组列表信息
     */
    List<FormGroupListVO> select(FormGroupQuery formGroupQuery, String siteId);

    /**
     * 查询表单字段分组记录数
     *
     * @param formGroupQuery 查询条件
     * @param siteId         所属站点id
     * @return 表单字段分组记录数
     */
    int selectCount(FormGroupQuery formGroupQuery, String siteId);

    /**
     * 分页查询表单字段分组
     *
     * @param formGroupQuery 查询条件
     * @param siteId         所属站点id
     * @return 表单字段分组列表信息
     */
    Page<FormGroupListVO> selectPage(FormGroupQuery formGroupQuery, String siteId);


    /**
     * 根据表单字段分组id查找
     *
     * @param formGroupId 表单字段分组id
     * @param siteId      所属站点id
     * @return 表单字段分组
     */
    FormGroupDO selectDOById(Long formGroupId, String siteId);

    /**
     * 查询表单字段分组
     *
     * @param formGroupQuery 查询条件
     * @param siteId         所属站点id
     * @return 表单字段分组列表
     */
    List<FormGroupDO> selectDO(FormGroupQuery formGroupQuery, String siteId);

    /**
     * 根据租户id查询租户的表单模板
     *
     * @param formType  表单类型
     * @param tokenUser 当前用户
     * @return 表单模板
     */
    List<FormGroupVO> findBySiteId(String formType, TokenUser tokenUser);

    /**
     * 查询表头
     *
     * @param headerFieldsQuery 查询条件
     * @param tokenUser         当前用户
     * @return 表头
     */
    FormHeaderVO getHead(HeaderFieldsQuery headerFieldsQuery, TokenUser tokenUser);

    /**
     * 根据表单类型查询对应的默认表单分组
     *
     * @param formType 表单类型
     * @return 默认表单分组
     */
    List<FormGroupDO> selectDefaultFormByType(String formType);

    /**
     * 根据subjectId查询表单
     *
     * @param subjectId  subject
     * @param formType   表单类型
     * @param moduleCode moduleCode
     * @param tokenUser  当前用户
     * @return 表单
     */
    List<FormGroupVO> selectBySubjectIdAndFormType(String subjectId, String formType, String moduleCode, TokenUser tokenUser);

    /**
     * 构建组织树
     *
     * @param formGroupList 平铺列表
     * @return 树列表
     */
    List<FormGroupVO> buildFormGroupTree(List<FormGroupVO> formGroupList);
}


